package com.zmn.oms.persistence.interfaces.work;

import com.zmn.oms.model.entity.work.OrderWork;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 类描述：工单持久层
 *
 * @author lujia
 * @date 2018-11-03 09:30:34
 */
public interface OrderWorkDao {

    /**
     * 根据订单id查询工单集合
     *
     * @param orderIdList 订单Id集合
     * @return 工单集合
     */
    List<OrderWork> listEsOrderWorkByOrderIdList(@Param("orderIdList") List<Long> orderIdList);

    /**
     * 根据ID查询
     *
     * @param orderId 订单Id
     * @param workId  工单Id
     * @return
     */
    OrderWork findOrderWorkByKey(@Param("orderId") Long orderId, @Param("workId") Long workId);


    /**
     * 动态查询orderWork
     * @param querySql
     * @param orderId
     * @param workId
     * @return
     */
    OrderWork findDynamicOrderWorkByKey(@Param("querySql") String querySql, @Param("orderId") Long orderId, @Param("workId") Long workId);

    /**
     * 根据ID和工程师Id查询查询
     *
     * @param orderId
     * @param workId
     * @param masterId
     * @return
     */
    OrderWork findMasterWorkDetail(@Param("orderId") Long orderId, @Param("workId") Long workId, @Param("masterId") Integer masterId);

    /**
     * 工程师接单
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateMasterTake(OrderWork orderWork);

    /**
     *  工程师出发
     * @param orderWork
     * @return
     */
    Integer updateMasterLeave(OrderWork orderWork);

    /**
     * 工程师上门
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateMasterVisit(OrderWork orderWork);

    /**
     * 更新师傅上门时间
     * @param orderWork
     * @return
     */
    Integer updateMasterVisitTime(OrderWork orderWork);

    /**
     * 标记为使用配件
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateUsePart(OrderWork orderWork);

    /**
     * 修改纸质保单号
     *
     * @param orderWork 工单
     * @return 影响行数
     */
    Integer updateManualCode(OrderWork orderWork);

    /**
     * 工程师备注
     *
     * @param orderWork 工单
     * @return 影响行数
     */
    Integer updateMasterRemark(OrderWork orderWork);

    /**
     * 更新跟单状态
     *
     * @param orderWork 工单
     * @return 影响行数
     */
    Integer updateTrackStatus(OrderWork orderWork);

    /**
     * 更新贴花状态
     *
     * @param orderWork 工单
     * @return 影响行数
     */
    Integer updateAppliqueStatus(OrderWork orderWork);

    /**
     * 工单服务完成
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateServiceComplete(OrderWork orderWork);


    /**
     * 工单完成
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateComplete(OrderWork orderWork);

    /**
     * 记录联系用户时间
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateContactUser(OrderWork orderWork);

    /**
     * 收单
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateCheckout(OrderWork orderWork);

    /**
     * 算账
     *
     * @param orderWork
     * @return 影响行数
     */
    Integer updateAccount(OrderWork orderWork);

    /**
     * 修改渠道
     *
     * @param orderWork
     */
    void updateChannel(OrderWork orderWork);

    /**
     * 保存派单
     *
     * @param orderWork 工单
     */
    void updateDistribute(OrderWork orderWork);

    /**
     * 保存多工程师
     *
     * @param orderWork 工单
     * @return
     */
    void updateMultiMaster(OrderWork orderWork);

    /**
     * 取消操作
     *
     * @param orderWork
     */
    void updateCancel(OrderWork orderWork);

    /**
     * 更新异常状态
     *
     * @param orderWork
     */
    void updateAbnormalStatus(OrderWork orderWork);

    /**
     * 更新投诉状态
     *
     * @param orderWork
     */
    void updateComplaintStatus(OrderWork orderWork);

    /**
     * 更新渠道结算状态
     *
     * @param orderWork
     */
    void updateOrderChannelSettleStatus(OrderWork orderWork);

    /**
     * 修改回访
     *
     * @param orderWork
     */
    void updateReplyVisit(OrderWork orderWork);

    /**
     * 修改当前备注
     *
     * @param orderWork
     */
    void updateWorkRemark(OrderWork orderWork);

    /**
     * 修改订单状态，已确认->已录入
     *
     * @param orderWork
     */
    void updateConfirmToInputStatus(OrderWork orderWork);

    /**
     * 确认修改
     *
     * @param orderWork
     */
    void updateConfirm(OrderWork orderWork);

    /**
     * 修改订单状态，已分单、已派单、已领单、已上门状态 -> 已确认
     *
     * @param orderWork
     * @param fields 需要更新的属性 totalAmount、depositAmount
     */
    void updateAssignBack(@Param("orderWork") OrderWork orderWork, @Param("fields") Map<String, Boolean> fields);

    /**
     * 修改订单状态 已派单、已领单、已上门状态 -> 已分单
     * @param orderWork
     * @param fields
     */
    void updateToAssignStatus(@Param("orderWork") OrderWork orderWork, @Param("fields") Map<String, Boolean> fields);

    /**
     * 配件报销
     *
     * @param orderWork
     */
    void updatePartReimburse(OrderWork orderWork);

    /**
     * 修改
     *
     * @param orderWork
     */
    void updateOrderWorkByKey(OrderWork orderWork);

    /**
     * 工程师收款金额支付
     *
     * @param orderWork
     */
    void updateMasterAmountPay(OrderWork orderWork);

    /**
     * 修改预约时间
     *
     * @param orderWork
     */
    void updateOrderWorkDutyTimeByKey(OrderWork orderWork);

    /**
     * 修改地址
     *
     * @param orderWork
     */
    void updateOrderWorkAddressByKey(OrderWork orderWork);

    /**
     * 清空返修信息
     *
     * @param orderWork
     */
    void updateCleanReworkByKey(OrderWork orderWork);

    /**
     * 更改用户
     *
     * @param orderIdSet
     * @param newUserId
     */
    void updateUserIdByOrderIds(@Param("orderIdSet") Set<Long> orderIdSet, @Param("newUserId") Long newUserId);

    /**
     * 老系统数据同步
     *
     * @param orderWork
     */
    void updateOldSysSync(OrderWork orderWork);

    /**
     * 订单分单
     *
     * @param orderWork
     */
    void updateOrderWorkAssign(OrderWork orderWork);

    /**
     * 接单
     *
     * @param orderWork
     */
    void updateOrderWorkAssignConfirm(OrderWork orderWork);

    /**
     * 新增工单
     *
     * @param orderWork 工单
     * @return
     */
    Integer insertOrderWork(OrderWork orderWork);

    /**
     * 修改服务平台
     * @param orderWork
     */
    void updatePlatWorkById(OrderWork orderWork);

    /**
     * 修改上门用户Id
     * @param orderWork
     */
    void updateVisitUserId(OrderWork orderWork);

    /**
     * 修改付款用户Id
     * @param orderWork
     */
    void updateCustomerUserId(OrderWork orderWork);
    /**
     * 修改产品Id
     * @param orderWork
     */
    void updateProductIdByKey(OrderWork orderWork);

    /**
     * 修改一口价标识
     * @param orderWork
     */
    void updateFinalPriceByKey(OrderWork orderWork);    
    
    /**
     * 修改挂起操作
     * @param orderWork
     */
    void updateOrderWorkSuspendByKey(OrderWork orderWork);

    /**
     * 修改工程师主管
     *
     * @param orderWork
     */
    void updateOrderMasterSupervisorByKey(OrderWork orderWork);

    /**
     * 修改保留配件申请
     * @param orderWork
     */
    Integer updatePartRetainByKey(OrderWork orderWork);

    /**
     * 修改子公司
     * @param orderWork
     */
    Integer updateOrderWorkCompany(OrderWork orderWork);

    void updateOrderServItemTypeByKey(OrderWork updateOrderWork);

    void updateOrderWorkDiscountInfo(OrderWork orderWork);
}
